home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-9.10-netbook-remix-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / nevow / page.py < prev    next >
Encoding:
Python Source  |  2006-07-17  |  2.9 KB  |  109 lines

  1. # -*- test-case-name: nevow.test.test_element -*-
  2.  
  3. """
  4. Basic rendering classes for Nevow applications.
  5.  
  6. API Stability: Completely unstable.
  7. """
  8.  
  9. from zope.interface import implements
  10.  
  11. from nevow.inevow import IRequest, IData, IRenderer, IRendererFactory
  12. from nevow.context import WovenContext
  13. from nevow.tags import invisible
  14. from nevow.errors import MissingRenderMethod, MissingDocumentFactory
  15.  
  16. from nevow.util import Expose
  17. from nevow.rend import _getPreprocessors
  18.  
  19. renderer = Expose(
  20.     """
  21.     Allow one or more methods to be used to satisfy template render
  22.     directives::
  23.  
  24.     | class Foo(Element):
  25.     |     def twiddle(self, request, tag):
  26.     |         return tag['Hello, world.']
  27.     |     renderer(twiddle)
  28.  
  29.     | <div xmlns:nevow="http://nevow.com/ns/nevow/0.1">
  30.     |     <span nevow:render="twiddle" />
  31.     | </div>
  32.  
  33.     Will result in this final output:
  34.  
  35.     | <div>
  36.     |     <span>Hello, world.</span>
  37.     | </div>
  38.     """)
  39.  
  40.  
  41.  
  42. class Element(object):
  43.     """
  44.     An Element is an object responsible for rendering part or all of a page.
  45.  
  46.     Elements provide a way to separate the responsibility for page rendering
  47.     into different units of code.
  48.  
  49.     Elements implement L{IRendererFactory} to return render methods which are
  50.     registered using L{nevow.page.renderer}.  For example::
  51.  
  52.         class Menu(Element):
  53.             def items(self, request, tag):
  54.                 ....
  55.             renderer(items)
  56.  
  57.     Render methods are invoked with two arguments: first, the
  58.     L{nevow.inevow.IRequest} being served and second, the tag object which
  59.     "invoked" the render method.
  60.  
  61.     @ivar docFactory: The L{inevow.IDocFactory} which will be used during
  62.     rendering.
  63.     """
  64.     implements(IRendererFactory, IRenderer)
  65.  
  66.     docFactory = None
  67.     preprocessors = ()
  68.  
  69.     def __init__(self, docFactory=None):
  70.         if docFactory is not None:
  71.             self.docFactory = docFactory
  72.  
  73.  
  74.     # IRendererFactory
  75.     def renderer(self, context, name):
  76.         renderMethod = renderer.get(self, name, None)
  77.         if renderMethod is None:
  78.             raise MissingRenderMethod(self, name)
  79.         # XXX Hack to avoid passing context and data to the render method.
  80.         # Eventually the rendering system should just not pass these to us.
  81.         return lambda self, ctx, data: renderMethod(IRequest(ctx), ctx.tag)
  82.  
  83.  
  84.     # IRenderer
  85.     def rend(self, ctx, data):
  86.         # Unfortunately, we still need a context to make the rest of the
  87.         # rendering process work.  A goal should be to elimate this completely.
  88.         context = WovenContext()
  89.  
  90.         if self.docFactory is None:
  91.             raise MissingDocumentFactory(self)
  92.  
  93.         preprocessors = _getPreprocessors(self)
  94.  
  95.         doc = self.docFactory.load(context, preprocessors)
  96.  
  97.         context.remember(self, IData)
  98.         context.remember(self, IRenderer)
  99.         context.remember(self, IRendererFactory)
  100.         context.tag = invisible[doc]
  101.         return context
  102.  
  103.  
  104. __all__ = [
  105.     'renderer',
  106.  
  107.     'Element',
  108.     ]
  109.